/**
 * 判断参数 s 是否为字符串
 * @param {*} s
 * @returns
 */
export function isStrOrNum(s: any) {
  return typeof s === "string" || typeof s === "number";
}

/**
 * 判断参数 fn 是否为函数
 * @param {*} fn
 * @returns
 */
export function isFn(fn: any) {
  return typeof fn === "function";
}

/**
 * 判断参数 s 是否为 undefined
 * @param {*} s
 * @returns
 */
export function isUndefined(s: any) {
  return s === undefined;
}

/**
 * 更新fiber节点中dom元素的属性
 */
export function updateFiberNode(dom: HTMLElement, oldProps: any, newProps: any) {
  // 对旧值进行处理
  Object.keys(oldProps).forEach((key) => {
    const value = oldProps[key];
    if (key === "children") {
      // 是字符串
      if (isStrOrNum(value)) {
        dom.textContent = "";
      }
    } else if (key.startsWith("on")) {
      // 绑定了事件
      const eventName = key.toLowerCase().slice(2);
      dom.removeEventListener(eventName, value);
    } else {
      // 普通的属性
      if (!(key in newProps)) {
        dom.removeAttribute(key);
      }
    }
  });

  // 2. 对新值进行处理
  Object.keys(newProps).forEach((key) => {
    const value = newProps[key];
    if (key === "children") {
      // 是字符串
      if (isStrOrNum(value)) {
        dom.textContent = String(value);
      }
    } else if (key.startsWith("on")) {
      // 绑定了事件
      const eventName = key.toLowerCase().slice(2);
      dom.addEventListener(eventName, value);
    } else {
      // react 中对class属性进行了特殊处理，所以我们也要转换一下
      if (key.toLocaleLowerCase() === "classname") {
        key = "class";
      }
      // 普通的属性
      dom.setAttribute(key, value);
    }
  });
}

export function getCurrentTime() {
  return performance.now();
}
